package com.itheima.a02polymorphismdemo02;

/***
 *@title Test
 *@description <TODO description class purpose>
 *@author 12468
 *@version 1.0.0
 *@create 2024/10/23 23:16
 **/
public class Test {
    public static void main(String[] args) {
        // 创建对象（多态方法）
        // Fu f = new Zi()
        Animal a = new Dog();
        /*
            调用成员变量：编译看左边，运行也看左边
                编译看左边：javac 编译代码的时候，会看左边的父类有没有这个变量，如果有，编译成功，如果没有编译失败
                运行也看左边：Java 运行代码的时候，实际获取的就是左边父类中成员变量的值
         */
        System.out.println(a.name); // 动物

        /*
            调用成员方法：编译看左右，运行看右边
                编译看左边：javac 编译代码的时候，会看左边父类中有没有这个方法，如果有，编译成功，如果没有编译失败
                运行看右边：java 运行代码的时候，实际上运行的是子类中的方法
         */

        a.show(); // Dog---show放

        /*
            理解：
                Animal a = new Dog();
                现在用 a 去调用变量和方法的呀？是的
                而 a 是 Animal 类型的，所以默认都会从 Animal 这个类中去找
                成员变量：在子类的对象中，会把父类的成员变狼也继承下的。父： name 子：name
                成员方法：如果子类对方法进行了重写，那么在虚方法表中时会把父类的方法进行覆盖的
         */
    }
}

class Animal {
    String name = "动物";

    public void show() {
        System.out.println("Animal---show方法");
    }
}


class Dog extends Animal {
    String name = "狗";

    @Override
    public void show() {
        System.out.println("Dog---show放");
    }
}

class Cat extends Animal {
    String name = "猫";

    @Override
    public void show() {
        System.out.println("Cat---show方法");
    }
}